package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.BOTEmpresaService;
import co.gov.medellin.ssti.sub.model.service.BeneficioService;
import co.gov.medellin.ssti.sub.model.service.EmpresaService;
import co.gov.medellin.ssti.sub.model.service.RestriccionService;
import co.gov.medellin.ssti.sub.model.service.SedeService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.Beneficiario_AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.EmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ModificarBOTVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.exception.AdministrationUserException;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.paoyer.administration.util.AccessControl;
import co.gov.medellin.ssti.sub.paoyer.common.exception.CommonUserException;
import co.gov.medellin.ssti.sub.paoyer.common.exception.UserException;
import co.gov.medellin.ssti.sub.web.form.ValidarBOTEmpresaForm;

@Component
public class ValidarModificarBOTEmpresaAction extends Action {
	@Autowired
	AtributosService atributosServiceImpl;
	@Autowired
	BeneficioService beneficioServiceImpl;
	@Autowired
	EmpresaService empresaServiceImpl;
	@Autowired
	BOTEmpresaService botEmpresaServiceImpl;
	@Autowired
	RestriccionService restriccionServiceImpl;
	@Autowired
	SedeService sedeServiceImpl;
	@Autowired
	SubprogramaService subprogramaServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		UserVO user = (UserVO) request.getSession().getAttribute("userInfo");
		ActionMessages messages = new ActionMessages();
		try {
			AccessControl access = new AccessControl();
			access.validateAccess(mapping, request, response);
		} catch (UserException ue) {
			messages.add("msgWarn", new ActionMessage("loginForm.message."
					+ ue.getExceptionVO().getId()));
			saveMessages(request, messages);
			if (ue.getExceptionVO().getId() == AdministrationUserException.ENDED_SESSION) {
				response.sendRedirect(request.getContextPath() + "/index.jsp");
				return null;
			} else if (ue.getExceptionVO().getId() == CommonUserException.NOT_ALLOWED_RESOURCE) {
				response.sendRedirect(request.getContextPath()
						+ "/admin/tile/invalidatedResource.jsp");
				return null;
			} else {
				return mapping.getInputForward();
			}

		}

		HttpSession session = request.getSession();
		String codeBOT = request.getParameter("codigoBOT");
		String codeBeneficio = request.getParameter("codigoBeneficio");
		String codeEmpresa = request.getParameter("codigoEmpresa");

		ValidarBOTEmpresaForm formBean = (ValidarBOTEmpresaForm) form;

		// vars
		String usuarioModifica = user.getName();
		String terminalAddress = request.getRemoteAddr();
		String strTerminal = ("WEB=" + terminalAddress);
		Long sbprCodigo = formBean.getBot().getSbprCodigo();
		Long empCodigo = formBean.getBot().getEmpCodigo();
		String bKtercero = formBean.getBot().getTercero();
		Long sedeCodigo = formBean.getBot().getSedeCodigo();
		Long valorBeneficio = formBean.getBot().getValorBeneficio();
		String fechaMedicion = formBean.getBot().getFechaMedicion();
		Long codigoBOT = formBean.getBot().getCodigo();
		String tipoBeneficio = formBean.getBot().getTipoBeneficio();
		String vigenciaBeneficio = formBean.getBot().getVigenciaBeneficio();

		//
		if (codeBOT != null && !codeBOT.equals("")
		/* && !formBean.getOperacion().equals(Utility.OP_GUARDAR) */) {
			BeneficioOtorgadoEmpresaVO beneficioOtorgadoEmpresaVO = botEmpresaServiceImpl
					.findBOT(Long.valueOf(codeBOT));
			formBean.setCodigoBOT(codeBOT);
			SubprogramaVO subprogramaVO = subprogramaServiceImpl
					.findSubprogramaByCodigo(Long.valueOf(codeBeneficio));
			formBean.setSubprogramaVO(subprogramaVO);

			if (beneficioOtorgadoEmpresaVO != null) {
				formBean.setBot(beneficioOtorgadoEmpresaVO);
			}

		}
		if (codeBeneficio != null && !codeBeneficio.equals("")) {
			formBean.setCodigoBeneficio(codeBeneficio);
		}

		// obtener vo empresa mediante codigo
		if (codeEmpresa != null && !codeEmpresa.equals("")) {
			EmpresaVO vo = empresaServiceImpl.findEmpresaByCodigo(Long
					.valueOf(codeEmpresa));
			if (vo != null) {
				formBean.setEmpresaVO(vo);
			}
		}

		try {

			String strSede = botEmpresaServiceImpl
					.findSedeOtorgamientoByCodBot(Long.valueOf(codeBOT));

			if (codeBeneficio != null) {

				List<AtributoVO> atributos = (List<AtributoVO>) atributosServiceImpl
						.findAtributosSubprograma(Long.valueOf(codeBeneficio),
								"A", 0);
				if (atributos != null && !atributos.isEmpty()) {
					formBean.setAtributos(atributos);
				}

				List<ModificarBOTVO> resultados = new ArrayList<ModificarBOTVO>();

				for (int i = 0; i < atributos.size(); i++) {
					AtributoVO atrivo = new AtributoVO();
					atrivo = (AtributoVO) atributos.get(i);
					if (atrivo.getTipoatributo().equals("R")) {
						System.out.println("R.");
						throw new RuntimeException("R!");
						/*
						 * String strValor = botEmpresaServiceImpl
						 * .findBeneficiarioAtri(atrivo.getTipodato(),
						 * codeEmpresa, atrivo.getCodatributo()); if (strValor
						 * != null && !strValor.equals("")) { ModificarBOTVO
						 * modifBOTVO = new ModificarBOTVO();
						 * modifBOTVO.setNombre(atrivo.getNombre());
						 * modifBOTVO.setValorInicial(strValor); modifBOTVO
						 * .setTipoatributo(atrivo.getTipoatributo());
						 * resultados.add(modifBOTVO); } else { ModificarBOTVO
						 * modifBOTVO = new ModificarBOTVO();
						 * modifBOTVO.setNombre(atrivo.getNombre());
						 * modifBOTVO.setValorInicial(""); modifBOTVO
						 * .setTipoatributo(atrivo.getTipoatributo());
						 * resultados.add(modifBOTVO); }
						 */
					} else {
						if (!strSede.equals("")) {
							// consulta valor y codigo de atributos del
							// beneficio
							ModificarBOTVO modificarBOTVO = botEmpresaServiceImpl
									.findBeneficioAtri(atrivo.getTipodato(),
											codeBOT, atrivo.getCodatributo());

							modificarBOTVO.setNombre(atrivo.getNombre());
							modificarBOTVO.setTipoatributo(atrivo
									.getTipoatributo());
							if (modificarBOTVO.getValorInicial() == null) {
								modificarBOTVO.setValorInicial("");
							}
							resultados.add(modificarBOTVO);
						}
					}
				}

				formBean.setResultados(resultados);

				/*
				 * 
				 */

				Collection<SedeVO> sedes = null;
				sedes = sedeServiceImpl.findTotalSedebyUser(user.getCode(),
						new Long(codeBeneficio), user.getUserGroupName(),
						user.getCodeArea(), strSede);

				if (sedes != null) {
					if (!sedes.isEmpty()) {
						formBean.setSedes(sedes);
					} else {
						if (formBean.getSedes() != null) {
							formBean.getSedes().clear();
						}
						request.setAttribute("msg",
								"Verifique la vigencia del Beneficio.");
						return mapping.findForward("fail");
					}
				}
			}
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}
		boolean permiso = false;
		try {
			permiso = botEmpresaServiceImpl.validarEditBOT(
					user.getUserGroupName(), user.getName(),
					Long.valueOf(codeBOT));
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}
		if (!permiso) {
			request.setAttribute("msg",
					"No tiene permisos para modificar el beneficio otorgado");
			return mapping.findForward("fail");
		} else {
			System.out.println(request.getAttribute("operacion"));
			if (formBean.getOperacion().equals(Utility.OP_GUARDAR)) {

				List<String> lError = new ArrayList<String>();
				List<Beneficiario_AtributoVO> lInsertar = new ArrayList<Beneficiario_AtributoVO>();
				List<Beneficiario_AtributoVO> lInsertTercero = new ArrayList<Beneficiario_AtributoVO>();
				List<AtributoVO> lAtriNoRestric = new ArrayList<AtributoVO>();
				List<AtributoVO> lAtriAlerta = new ArrayList<AtributoVO>();

				String variable = "";
				String tipodato = "";
				int compara1 = 0;
				int compara2 = 0;

				// TODO: validar fecha.

				// Guardar modificacion BOT
				Iterator<AtributoVO> it = formBean.getAtributos().iterator();
				while (it.hasNext()) {
					AtributoVO atri = it.next();
					String codigo = atri.getCodatributo();
					String obtenercod = "Atri" + codigo;
					String obligacion = atri.getObligatorio();

					if (obligacion.equals("S")) {
						compara1++;
						String obCodVeri = (String) request
								.getParameter(obtenercod);
						if (!obCodVeri.equals("")) {
							compara2++;
						} else {
							String NomError = atri.getEtiqueta();
							lError.add(NomError);
						}
					}
				}

				// proceso para validar los campos con las restricciones
				if (compara1 == compara2) {
					String tercero = beneficioServiceImpl.findTercero(new Long(
							codeBOT));
					if (tercero != null) {
						it = formBean.getAtributos().iterator();
						while (it.hasNext()) {
							Beneficiario_AtributoVO objinsettercero = new Beneficiario_AtributoVO();
							AtributoVO atritercero = (AtributoVO) it.next();

							String strCodiAtri = atritercero.getCodatributo();
							String strTipoAtri = atritercero.getTipoatributo();
							tipodato = atritercero.getTipodato();
							variable = request.getParameter("Atri"
									+ atritercero.getCodatributo());

							if (strTipoAtri.equals("R")) {
								objinsettercero.setVariable(variable);
								objinsettercero.setTipodato(tipodato);
								objinsettercero.setCodigoatributo(strCodiAtri);
								objinsettercero.setCodbeneficiario(codeEmpresa);
								objinsettercero.setTipoatributo(strTipoAtri);
								lInsertar.add(objinsettercero);

							} else {
								objinsettercero.setVariable(variable);
								objinsettercero.setTipodato(tipodato);
								objinsettercero.setCodigoatributo(strCodiAtri);
								objinsettercero.setTipoatributo(strTipoAtri);
								lInsertar.add(objinsettercero);

							}

							objinsettercero.setVariable(variable);
							objinsettercero.setTipodato(tipodato);
							objinsettercero.setCodigoatributo(strCodiAtri);
							objinsettercero.setCodbeneficiario(codeEmpresa);
							objinsettercero.setTipoatributo(strTipoAtri);
							lInsertTercero.add(objinsettercero);
						}
						session.setAttribute("listatercero", lInsertTercero);

					} else {
						it = formBean.getAtributos().iterator();
						while (it.hasNext()) {

							Beneficiario_AtributoVO objBenAtriVO = new Beneficiario_AtributoVO();
							AtributoVO atrirestri = it.next();
							String strCodiAtri = atrirestri.getCodatributo();
							String strCodiRest = atrirestri.getRestriccion();
							String strTipoAtri = atrirestri.getTipoatributo();
							tipodato = atrirestri.getTipodato();

							variable = request.getParameter("Atri"
									+ atrirestri.getCodatributo());

							if (strCodiRest != null && !strCodiRest.isEmpty()) {
								try {
									String ArrRest[] = restriccionServiceImpl
											.validarRestriccion(strCodiAtri,
													strCodiRest, variable,
													tipodato);
									if (ArrRest[0].equals("N")) {
										if (ArrRest[1].equals("true")) {

											formBean.setMensajes("1");

											if (strTipoAtri.equals("R")) {
												objBenAtriVO
														.setVariable(variable);
												objBenAtriVO
														.setTipodato(tipodato);
												objBenAtriVO
														.setCodigoatributo(strCodiAtri);
												objBenAtriVO
														.setCodbeneficiario(codeEmpresa);
												objBenAtriVO
														.setTipoatributo(strTipoAtri);
												lInsertar.add(objBenAtriVO);

											} else {
												objBenAtriVO
														.setVariable(variable);
												objBenAtriVO
														.setTipodato(tipodato);
												objBenAtriVO
														.setCodigoatributo(strCodiAtri);
												objBenAtriVO
														.setTipoatributo(strTipoAtri);
												lInsertar.add(objBenAtriVO);

											}
										} else {

											formBean.setMensajes("2");
											atrirestri.setDescrest(ArrRest[2]);
											lAtriNoRestric.add(atrirestri);

										}
									} else {
										if (ArrRest[1].equals("false")) {
											formBean.setMensajes("3");
											atrirestri.setDescrest(ArrRest[2]);
											lAtriAlerta.add(atrirestri);

										}
										if (strTipoAtri.equals("R")) {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setCodbeneficiario(codeEmpresa);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);
										} else {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);
										}
									}
								} catch (DAOException e) {
									SUBException.logDebugError("", e);
								}
							} else {
								if (strTipoAtri.equals("R")) {
									objBenAtriVO.setVariable(variable);
									objBenAtriVO.setTipodato(tipodato);
									objBenAtriVO.setCodigoatributo(strCodiAtri);
									objBenAtriVO
											.setCodbeneficiario(codeEmpresa);
									objBenAtriVO.setTipoatributo(strTipoAtri);
									lInsertar.add(objBenAtriVO);
								} else {
									objBenAtriVO.setVariable(variable);
									objBenAtriVO.setTipodato(tipodato);
									objBenAtriVO.setCodigoatributo(strCodiAtri);
									objBenAtriVO.setTipoatributo(strTipoAtri);
									lInsertar.add(objBenAtriVO);
								}
							}
						}
					}

					if (lAtriNoRestric.size() > 0) {
						formBean.setlAtriNoRestric(lAtriNoRestric);
					}

					if (lAtriAlerta.size() > 0) {
						formBean.setlAtriAlerta(lAtriAlerta);
					}
					formBean.setMensaje("1");
					formBean.setlInsertar(lInsertar);

				} else {
					int tama = lError.size();
					String strTamaError = String.valueOf(tama);
					if (lAtriNoRestric.size() > 0) {
						formBean.setlAtriNoRestric(lAtriNoRestric);
					}

					if (lAtriAlerta.size() > 0) {
						formBean.setlAtriAlerta(lAtriAlerta);
					}
					formBean.setlError(lError);
					formBean.setStrTamaError(strTamaError);
					formBean.setMensaje("2");
				}
				if ((lAtriAlerta.size() > 0) || (lAtriNoRestric.size() > 0)
						|| lError.size() > 0) {
					return mapping.findForward("success");
				} else {

					List<Beneficiario_AtributoVO> lInsert = new ArrayList<Beneficiario_AtributoVO>();
					String strTercero = "";

					boolean disponibilidad = true;

					// String strCodigoSubpro =
					// formBean.getBot().getSbprCodigo()
					// .toString();
					// String strCodigoSede =
					// formBean.getCodigoSede().toString();
					// String strCostBenefit = formBean.getBot()
					// .getValorBeneficio().toString();
					// String strDateBenefit = formBean.getBot()
					// .getFechaBeneficio();
					// String strTypeBenefit = formBean.getBot()
					// .getTipoBeneficio();
					// String strFechaMedicion = formBean.getBot()
					// .getFechaMedicion();

					List<Beneficiario_AtributoVO> obTercero = lInsertTercero;
					List<Beneficiario_AtributoVO> obListaInsert = (List<Beneficiario_AtributoVO>) formBean
							.getlInsertar();

					if (obTercero == null || obTercero.isEmpty()) {
						lInsert = obListaInsert;
					} else {
						lInsert = obTercero;
						strTercero = formBean.getBot().getTercero();
					}

					if (obListaInsert != null) {
						try {

							long totaldias = 1;

							// determinar si hay beneficios
							// String codeSedeOld = formBean.getBot()
							// .getSedeCodigo().toString();
							Long codeSedeOld = formBean.getBot()
									.getSedeCodigo();

							if (codeSedeOld.equals(sedeCodigo)) {
								disponibilidad = true;
							} else {
								int disponible = beneficioServiceImpl
										.findDisponibilidad(sedeCodigo,
												sbprCodigo);
								if (totaldias > disponible) {
									disponibilidad = false;
								}
							}

							if (disponibilidad) {

								BeneficioOtorgadoEmpresaVO beneficioOtorgadoEmpresaVO = new BeneficioOtorgadoEmpresaVO();
								// beneficioOtorgadoEmpresaVO
								// .setUsuarioModifica(user.getName());
								// beneficioOtorgadoEmpresaVO
								// .setTerminalModifica(strTerminal);
								// beneficioOtorgadoEmpresaVO.setSbprCodigo(Long
								// .valueOf(strCodigoSubpro));
								// beneficioOtorgadoEmpresaVO.setEmpCodigo(Long
								// .valueOf(codeEmpresa));
								// beneficioOtorgadoEmpresaVO
								// .setTercero(strTercero);
								// beneficioOtorgadoEmpresaVO.setSedeCodigo(Long
								// .valueOf(strCodigoSede));
								// beneficioOtorgadoEmpresaVO
								// .setValorBeneficio(Long
								// .valueOf(strCostBenefit));
								// beneficioOtorgadoEmpresaVO
								// .setFechaMedicion(strFechaMedicion);
								// beneficioOtorgadoEmpresaVO.setCodigo(Long
								// .valueOf(codeBOT));
								// beneficioOtorgadoEmpresaVO
								// .setTipoBeneficio(strTypeBenefit);
								// beneficioOtorgadoEmpresaVO
								// .setVigenciaBeneficio(formBean.getBot()
								// .getVigenciaBeneficio());

								beneficioOtorgadoEmpresaVO
										.setUsuarioModifica(usuarioModifica);
								beneficioOtorgadoEmpresaVO
										.setTerminalModifica(strTerminal);
								beneficioOtorgadoEmpresaVO
										.setSbprCodigo(sbprCodigo);
								beneficioOtorgadoEmpresaVO
										.setEmpCodigo(empCodigo);
								beneficioOtorgadoEmpresaVO
										.setTercero(bKtercero);
								beneficioOtorgadoEmpresaVO
										.setSedeCodigo(sedeCodigo);
								beneficioOtorgadoEmpresaVO
										.setValorBeneficio(valorBeneficio);
								beneficioOtorgadoEmpresaVO
										.setFechaMedicion(fechaMedicion);
								beneficioOtorgadoEmpresaVO.setCodigo(codigoBOT);
								beneficioOtorgadoEmpresaVO
										.setTipoBeneficio(tipoBeneficio);
								beneficioOtorgadoEmpresaVO
										.setVigenciaBeneficio(vigenciaBeneficio);

								boolean updated = botEmpresaServiceImpl
										.updateBOTEmpresa(
												beneficioOtorgadoEmpresaVO,
												Long.valueOf(codeSedeOld),
												lInsert);

								if (updated) {
									session.setAttribute("msg", "1");
								}
							} else {
								session.setAttribute("msgdis",
										"No hay beneficios disponibles en la sede seleccionada.");
							}
						} catch (Exception e) {
							SUBException.logDebugError("", e);
						}
					}
					ActionForward actionRedirect = new ActionForward(mapping
							.findForward("ver").getName(), mapping.findForward(
							"ver").getPath()
							+ "?codigoBeneficio="
							+ codeBeneficio
							+ "&codigoEmpresa=" + codeEmpresa, true);
					return actionRedirect;
				}
			}
			return mapping.findForward("success");
		}
	}
}
